Lazy এবং Eager Loading কি?
Spring Boot ORM, বিশেষ করে Hibernate-এ Lazy Loading এবং Eager Loading হলো ডেটাবেজ থেকে ডেটা ফেচ করার দুটি কৌশল।
Lazy Loading
- Lazy Loading হলো তখনই ডেটা লোড করা, যখন সেটি ব্যবহার করা হয়। এটি ডেটা লোড করার সময় কমায় এবং মেমরি ব্যবহার অপ্টিমাইজ করে।
- Hibernate-এ
FetchType.LAZYডিফল্ট ফেচ টাইপ।
Eager Loading
- Eager Loading হলো প্রথমবারেই সম্পর্কিত সমস্ত ডেটা লোড করা। এটি ডেটা অ্যাক্সেস দ্রুত করতে পারে তবে অপ্রয়োজনীয় ডেটা লোড হওয়ার ঝুঁকি থাকে।
- Hibernate-এ
FetchType.EAGERব্যবহার করলে সম্পর্কিত সমস্ত ডেটা ইমিডিয়েটলি লোড হয়।
@OneToMany এবং @ManyToOne এর মাধ্যমে উদাহরণ
টেবিল সম্পর্কের সেটআপ
আমরা দুটি Entity ক্লাস নেব: Category এবং Product। একটি Category-এর অধীনে একাধিক Product থাকতে পারে।
Entity গুলো তৈরি
Category Entity:
import jakarta.persistence.*;
import java.util.List;
@Entity
public class Category {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "category", fetch = FetchType.LAZY) // Lazy Loading
private List<Product> products;
// Getters and Setters
}
Product Entity:
import jakarta.persistence.*;
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Double price;
@ManyToOne(fetch = FetchType.EAGER) // Eager Loading
@JoinColumn(name = "category_id")
private Category category;
// Getters and Setters
}
Lazy Loading এর উদাহরণ
Lazy Loading এর সময় সম্পর্কিত ডেটা তখনই লোড হবে, যখন তা প্রথমবার অ্যাক্সেস করা হবে।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class CategoryService {
@Autowired
private CategoryRepository categoryRepository;
public void showCategoryWithProducts(Long categoryId) {
Category category = categoryRepository.findById(categoryId).orElse(null);
if (category != null) {
System.out.println("Category Name: " + category.getName());
// Lazy Loading: Products তখনই লোড হবে, যখন এটি অ্যাক্সেস করা হবে
List<Product> products = category.getProducts();
products.forEach(product -> System.out.println("Product Name: " + product.getName()));
}
}
}
সমস্যা:
Lazy Loading ব্যবহার করার সময় Session বন্ধ হয়ে গেলে LazyInitializationException হতে পারে।
Eager Loading এর উদাহরণ
Eager Loading এর সময় সম্পর্কিত সমস্ত ডেটা সরাসরি প্রথমবারেই লোড হয়।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class ProductService {
@Autowired
private ProductRepository productRepository;
public void showProductWithCategory(Long productId) {
Product product = productRepository.findById(productId).orElse(null);
if (product != null) {
System.out.println("Product Name: " + product.getName());
System.out.println("Category Name: " + product.getCategory().getName());
// Category ইতিমধ্যেই Eagerly লোড করা হয়েছে
}
}
}
সুবিধা:
Eager Loading ব্যবহার করলে LazyInitializationException এর ঝুঁকি নেই, কারণ সম্পর্কিত ডেটা লোড হওয়া নিশ্চিত।
Lazy এবং Eager Loading এর তুলনা
| বৈশিষ্ট্য | Lazy Loading | Eager Loading |
|---|---|---|
| ডেটা লোড টাইমিং | প্রয়োজন অনুযায়ী লোড হয়। | প্রথমবারেই সব সম্পর্কিত ডেটা লোড হয়। |
| পারফরম্যান্স | কম ডেটা লোড হওয়ায় দ্রুত। | বেশি ডেটা লোড হলে পারফরম্যান্স স্লো হতে পারে। |
| মেমরি ব্যবহার | কম মেমরি ব্যবহার করে। | বেশি মেমরি ব্যবহার করে। |
| LazyInitializationException | সম্ভাবনা থাকে। | থাকে না। |
সঠিক কৌশল নির্বাচন
- Lazy Loading: বড় ডেটাসেটের ক্ষেত্রে যেখানে সমস্ত ডেটা প্রয়োজন হয় না।
- Eager Loading: ছোট ডেটাসেটের ক্ষেত্রে বা যখন সমস্ত সম্পর্কিত ডেটা অবিলম্বে প্রয়োজন হয়।
Read more